package services

import (
	"reflect"
	"strings"

	"github.com/astaxie/beego/orm"
)

func arr_contains(arr []string, el string) bool {
	for i := range arr {
		if arr[i] == el {
			return true
		}
	}

	return false
}

// 基于实体类的字段填充情况作为查询条件
func Query_by_model[T interface{}](o orm.Ormer, pk_name string, cols []string, con_model T, dst_model *[]*T) {
	getType := reflect.TypeOf(con_model)
	q := o.QueryTable(strings.ToLower(getType.Name()))
	getValue := reflect.ValueOf(con_model)
	cond := orm.NewCondition()

	for i := 0; i < getType.NumField(); i++ {
		field := getType.Field(i)              // 获取字段类型
		value := getValue.Field(i).Interface() // 获取字段值

		if !strings.EqualFold(pk_name, strings.ToLower(field.Name)) && arr_contains(cols, strings.ToLower(field.Name)) {
			cond = cond.And(strings.ToLower(field.Name), value)
		}
	}

	q.SetCond(cond).All(dst_model)
}

// 获取实体中不为空的字段
func Get_nonnil_cols[T interface{}](con_model T) []string {
	getType := reflect.TypeOf(con_model)
	getValue := reflect.ValueOf(con_model)
	cols := []string{}
	for i := 0; i < getType.NumField(); i++ {
		field := getType.Field(i)              // 获取字段类型
		value := getValue.Field(i).Interface() // 获取字段值
		if value != nil {
			cols = append(cols, strings.ToLower(field.Name))
		}
	}

	return cols
}
